package com.xxx.service.impl;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.vo.CourseTypeCrumbsVo;
import com.xxx.domain.CourseType;
import com.xxx.exception.GlobleBussnessException;
import com.xxx.mapper.CourseTypeMapper;
import com.xxx.service.ICourseTypeService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author jh
 * @since 2025-09-03
 */
@Service
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {

    @Override
    public List<CourseType> treeData() {
        /**
         *   准备一个result集合
         *查询出所有课程目录 allTypes
         *将allTypes转成map  key:id  value:对象
         *遍历allTypes ,判断pid是否为0
         *  为0,将当前对象添加到result中
         *  不为0,从map中获取对象,将当前对象添加到父对象的子对象中
         */
        ArrayList<CourseType> result = new ArrayList<>();
        List<CourseType> allTypes = selectList(null);
        Map<Long, CourseType> map = allTypes.stream().collect(Collectors.toMap(CourseType::getId, courseType -> courseType));
        for (CourseType type : allTypes) {
            if (type.getPid() == 0) {
                result.add(type);
            } else {
                CourseType parent = map.get(type.getPid());
                if (parent != null) {
                    parent.getChildren().add(type);
                }
            }
        }
        return result;
    }

    @Override
    public List<CourseTypeCrumbsVo> getCourseTypeCrumbs(Long courseTypeId) {
        // 判断参数
        if (courseTypeId == null) {
            throw new GlobleBussnessException("参数异常");
        }

        // 根据id查询
        CourseType courseType = selectById(courseTypeId);

        if (courseType == null) {
            throw new GlobleBussnessException("参数异常");
        }

        // 获取path，
        String[] idStrs = courseType.getPath().split("\\.");

        List<CourseType> courseTypes = selectBatchIds(Arrays.asList(idStrs));

        List<CourseTypeCrumbsVo> courseTypeCrumbsVos = new ArrayList<>();

        courseTypes.forEach(type -> {
            EntityWrapper<CourseType> wrapper = new EntityWrapper<>();

            wrapper.eq("pid", type.getPid());
            wrapper.notIn("id", type.getId());
            List<CourseType> others = selectList(wrapper);

            courseTypeCrumbsVos.add(new CourseTypeCrumbsVo(type, others));
        });

        return courseTypeCrumbsVos;
    }
}
